package com.econ.powercloud.ems.util;

import com.econ.powercloud.ems.common.enums.GridRecordStatusEnum;
import com.econ.powercloud.ems.common.enums.GridTypeEnum;
import com.econ.powercloud.ems.dal.entity.EmsGridRecordNode;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author : zjf
 * @Description : 获取离并网中的拼接日志
 * @Date : 2022/8/26 17:53
 * @Modified by : zjf
 */
@Slf4j
public class GridLogUtil {

    /**
     * 下发遥控遥调日志(针对步骤)
     * @param stepResult : 下发是否成功
     * @param stepName : 步骤名称
     * @param issuedContent : 下发内容
     */
    public static String getIssuedYkYtLog(boolean stepResult,String stepName,String issuedContent){
        if(stepResult){
            return String.format("%s，%s命令，下发内容：%s",TimeUtil.dateToStrLong(new Date()),stepName,issuedContent);
        }
        return String.format("%s，%s命令失败，再次下发",TimeUtil.dateToStrLong(new Date()),stepName);
    }

    /**
     * 下发命令日志(针对步骤)
     * @param stepResult : 下发是否成功
     * @param stepName : 步骤名称
     * @param issuedContent : 下发内容
     */
    public static String getIssuedCommandLog(boolean stepResult,String stepName,String issuedContent){
        if(stepResult) {
            return String.format("%s，%s命令，下发命令：%s", TimeUtil.dateToStrLong(new Date()), stepName, issuedContent);
        }
        return String.format("%s，%s命令失败，再次下发",TimeUtil.dateToStrLong(new Date()),stepName);
    }

    /**
     * 收到网关回复日志(针对步骤)
     * @param oldLog : 追加前的日志
     * @param gateWayResult : 网关回复状态
     * @param stepName : 步骤名称
     * @return
     */
    public static String getGatewayReplyLog(String oldLog,boolean gateWayResult,String stepName){
        if(gateWayResult){
            return String.format("%s\n%s，网关收到命令",oldLog,TimeUtil.dateToStrLong(new Date()));
        }else {
            return String.format("%s\n%s，%s命令失败，再次下发",oldLog,TimeUtil.dateToStrLong(new Date()),stepName);
        }
    }

    /**
     * 查询实时数据日志(针对步骤)
     * @param stepResult : 步骤是否成功
     * @param stepName : 步骤名称
     * @param ditName : 查询点号名称
     * @param val : 查询点号值
     * @param expectVal : 期望值
     */
    public static String queryFlashDataLog(boolean stepResult,String stepName,String ditName,String val,String expectVal){
        if(stepResult){
            return String.format("%s，%s成功，点号：%s值为%s",TimeUtil.dateToStrLong(new Date()),stepName,ditName,val);
        }
        return String.format("%s，未接收到点号：%s的期望值%s，%s失败",TimeUtil.dateToStrLong(new Date()),ditName,expectVal,stepName);
    }

    /**
     * 节点日志
     * @param preconditionCode ： 前置条件是否成功
     * @param nodeResult : 节点执行状态
     * @param nodeName : 节点名称
     */
    public static String getNodeLog(boolean preconditionCode,boolean nodeResult,String nodeName){
        if(!preconditionCode){
            return String.format("结果：%s失败，前置流程失败无法进行当前操作",nodeName);
        }
        if(nodeResult){
            return String.format("结果：%s成功",nodeName);
        }
        return String.format("结果：%s失败",nodeName);
    }

    /**
     * 组合日志
     */
    public static String getCombinationLog(String combinationName, List<EmsGridRecordNode> nodeList, GridTypeEnum gridTypeEnum){
        //节点成功次数
        int successNum = nodeList.stream().filter(d->GridRecordStatusEnum.SUCCESS.getCode().equals(d.getStatus())).collect(Collectors.toList()).size();
        if(successNum == nodeList.size()){
            return String.format("结果：%s成功",combinationName);
        }
        if(successNum == 0){
            return String.format("结果：%s，所有流程失败，%s失败，终止%s",combinationName,GridTypeEnum.OFF_GRID == gridTypeEnum?"离网":"并网",
                    GridTypeEnum.OFF_GRID == gridTypeEnum?"离网操作":"并网操作");
        }
        StringBuilder sb = new StringBuilder();
        nodeList.stream().forEach(d->{
            sb.append(String.format("%s:%s，",d.getNodeTitle(), GridRecordStatusEnum.fromCode(d.getStatus())));
        });
        sb.deleteCharAt(sb.length() - 1);
        return String.format("结果：%s，是否忽视失败操作，进行后续流程（失败操作对应的设备后续将不进行任何操作，请谨慎跳过进入后续流程）",sb.toString());
    }

    /**
     * 终止日志
     * @param type 并离网类型值
     * @return 终止日志
     */
    public static String getTerminateLog(Integer type){
        return String.format("结果：手动终止%s", GridTypeEnum.getDescFromCode(type));
    }
}
